React์ ์คํ์ ์ธ experimental_useActionState ํ ์ ํตํด ์ก์ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
React experimental_useActionState ๊ตฌํ: ํฅ์๋ ์ก์ ์ํ ๊ด๋ฆฌ
React๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๋ฉฐ ๊ฐ๋ฐ์ ๊ฐ์ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ํฅ์์ํค๋ ํ์ ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋์
ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌํ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ experimental_useActionState ํ
์
๋๋ค. ์ด ํ
์ React์ ์คํ์ API์ ์ผ๋ถ๋ก, ๋น๋๊ธฐ ์ก์
๊ณผ ๊ด๋ จ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ ์ฐ์ํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํนํ ํผ์ด๋ ์๋ฒ ์ธก ๋ณ๊ฒฝ ์ฒ๋ฆฌ ์ ์ ์ฉํฉ๋๋ค. ์ด ๊ธ์์๋ experimental_useActionState ํ
์ ๋ํด ์ฌ๋ ์๊ฒ ๋ค๋ฃจ๋ฉฐ, ๊ทธ ์ด์ , ๊ตฌํ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ์ด์ ์ ๋ง์ถ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ก์ ์ํ ๊ด๋ฆฌ์ ์ดํด
experimental_useActionState์ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์ดํด๋ณด๊ธฐ ์ ์, ์ด ํ
์ด ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ง์ React ์ ํ๋ฆฌ์ผ์ด์
, ํนํ ํผ์ด๋ ๋ฐ์ดํฐ ์กฐ์๊ณผ ๊ด๋ จ๋ ๊ฒฝ์ฐ, ์ก์
์ ๋น๋๊ธฐ ์์
(์: ์๋ฒ์ ํผ ์ ์ถ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์
๋ฐ์ดํธ)์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ๋ก๋ฉ ์ํ, ์ค๋ฅ ๋ฉ์์ง, ์ฑ๊ณต ์งํ์ ๊ฐ์ ์ด๋ฌํ ์ก์
์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ธฐ์กด์ ์ํ ๊ด๋ฆฌ ๊ธฐ์ (์: useState, Redux, Context API)์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ๊ณ ์ฅํฉํด์ง ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ํผ์ ์ ์ถํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๋ค์์ ์ถ์ ํด์ผ ํฉ๋๋ค:
- ๋ก๋ฉ ์ํ: ํผ์ด ์ฒ๋ฆฌ ์ค์์ ๋ํ๋ ๋๋ค.
- ์ค๋ฅ ์ํ: ์ ์ถ์ด ์คํจํ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
- ์ฑ๊ณต ์ํ: ์ฑ๊ณต์ ์ผ๋ก ์ ์ถ๋์์ ๋ ์ฌ์ฉ์์๊ฒ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
์ ํต์ ์ผ๋ก ์ด๋ ์ฌ๋ฌ useState ํ
๊ณผ ๋น๋๊ธฐ ์ก์
์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ณต์กํ ๋ก์ง์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. experimental_useActionState ํ
์ ์ก์
๊ณผ ๊ด๋ จ ์ํ๋ฅผ ํ๋์ ๊ฐ๊ฒฐํ ๋จ์๋ก ์บก์ํํ์ฌ ์ด ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค.
experimental_useActionState ์๊ฐ
experimental_useActionState ํ
์ ์ก์
์ ์ํ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ก๋ฉ ์ํ, ์ค๋ฅ ๋ฐ ์ฑ๊ณต ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค. ์ด ํ
์ ์ก์
ํจ์๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ๊ณ ๋ค์์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค:
- ์ํ: ์ก์
์ ํ์ฌ ์ํ (์:
null, ์ค๋ฅ ๋ฉ์์ง ๋๋ ์ฑ๊ณต ๋ฐ์ดํฐ). - ์ก์ : ์ก์ ์ ํธ๋ฆฌ๊ฑฐํ๊ณ ์ํ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ ํจ์.
์ด ํ ์ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค:
- ํผ ์ฒ๋ฆฌ: ํผ ์ ์ถ ์ํ(๋ก๋ฉ, ์ค๋ฅ, ์ฑ๊ณต) ๊ด๋ฆฌ.
- ์๋ฒ ์ธก ๋ณ๊ฒฝ: ์๋ฒ์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ.
- ๋น๋๊ธฐ ์์ : ํ๋ก๋ฏธ์ค๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ํฌํจํ๋ ๋ชจ๋ ์์ ๊ด๋ฆฌ.
๊ตฌํ ์ธ๋ถ ์ ๋ณด
experimental_useActionState์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
const [state, action] = experimental_useActionState(originalAction);
์ฌ๊ธฐ์ originalAction์ ์ํ๋ ์์
์ ์ํํ๋ ํจ์์
๋๋ค. ์ด ์ก์
ํจ์๋ ์ฑ๊ณต์ ๋ํ๋ด๋ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. React๋ ์ก์
์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ state๋ฅผ ์๋์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์
์์ 1: ๊ธฐ๋ณธ ํผ ์ ์ถ
๊ฐ๋จํ ํผ ์ ์ถ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋จ์ผ ์ ๋ ฅ ํ๋์ ์ ์ถ ๋ฒํผ์ด ์๋ ํผ์ ๋ง๋ค ๊ฒ์ ๋๋ค. ํผ ์ ์ถ์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ด ๊ธ๋ก๋ฒ ์ปจํ ์คํธ๋ฅผ ์ํด, ์๋ฒ๋ ํ ๊ตญ๊ฐ์ ์๊ณ ํผ์ ์ ์ถํ๋ ์ฌ์ฉ์๋ ๋ค๋ฅธ ๊ตญ๊ฐ์ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์ด๋ ์ ์ฌ์ ์ธ ์ง์ฐ ์๊ฐ๊ณผ ๋ช ํํ ๋ก๋ฉ ์ํ์ ํ์์ฑ์ ๊ฐ์กฐํฉ๋๋ค.
import React from 'react';
import { experimental_useActionState as useActionState } from 'react';
async function submitForm(data) {
// ์ง์ฐ ์๊ฐ์ ํฌํจํ ์๋ฒ ์์ฒญ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 1000));
if (data.name === "error") {
throw new Error("Submission failed!");
}
return "Form submitted successfully!";
}
function MyForm() {
const [state, submit] = useActionState(async (prevState, formData) => {
const data = Object.fromEntries(formData);
return submitForm(data);
});
return (
);
}
export default MyForm;
์ด ์์ ์์:
submitFormํจ์๋ ์ง์ฐ ์๊ฐ์ ๋๊ณ ์๋ฒ ์์ฒญ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ๋ ฅ๊ฐ์ด "error"์ธ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.useActionStateํ ์ ํผ ์ ์ถ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.state๋ณ์๋ ์ก์ ์ ํ์ฌ ์ํ๋ฅผ ๋ด์ต๋๋ค(null์ด๊ธฐ๊ฐ, ์ ์ถ ์คํจ ์ ์ค๋ฅ ๋ฉ์์ง, ์ ์ถ ์ฑ๊ณต ์ ์ฑ๊ณต ๋ฉ์์ง).submitํจ์๋ ํผ ์ ์ถ์ ํธ๋ฆฌ๊ฑฐํ๋ ์ก์ ํจ์์ ๋๋ค.- ์ ์ถ ์ค์๋ ๋ฒํผ์ด ๋นํ์ฑํ๋์ด ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
- ์ค๋ฅ ๋ฐ ์ฑ๊ณต ๋ฉ์์ง๋
state์ ๋ฐ๋ผ ํ์๋ฉ๋๋ค.
์ค๋ช : ์ด ์์ ๋ ๊ธฐ๋ณธ์ ์ธ ํผ ์ ์ถ์ ๋ณด์ฌ์ค๋๋ค. ๋ฒํผ์ `disabled` ์์ฑ๊ณผ ํ์๋๋ ํ ์คํธ๊ฐ ํ์ฌ `state`์ ๋ฐ๋ผ ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋์ง ์ฃผ๋ชฉํ์ธ์. ์ด๋ ์ฌ์ฉ์์ ์์น์ ๊ด๊ณ์์ด ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ, ํนํ ๋ค์ํ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ ๊ฒฝํํ ์ ์๋ ํด์ธ ์ฌ์ฉ์๋ฅผ ์๋ํ ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค. ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ ์ถ์ด ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ๋ฉ์์ง๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ 2: ๋๊ด์ ์ ๋ฐ์ดํธ
๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ก์ ์ด ์ฑ๊ณตํ ๊ฒ์ฒ๋ผ UI๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํ๊ณ , ์ก์ ์ด ์คํจํ๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ํ๋กํ ์ด๋ฆ์ ์ ๋ฐ์ดํธํ๋ ์์ ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๋ฉ๋ฆฌ ๋จ์ด์ง ์๋ฒ๊ฐ ์์ ์ ์๋ ํ๋ซํผ๊ณผ ์ํธ ์์ฉํ๋ ํด์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, ๋๊ด์ ์ ๋ฐ์ดํธ๋ ๊ฒฝํ์ ๋ ๋ฐ์์ ์ผ๋ก ๋๋ผ๊ฒ ํ ์ ์์ต๋๋ค.
import React, { useState } from 'react';
import { experimental_useActionState as useActionState } from 'react';
async function updateProfileName(newName) {
// ์ง์ฐ ์๊ฐ์ ํฌํจํ ์๋ฒ ์์ฒญ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 1000));
if (newName === "error") {
throw new Error("Failed to update profile name!");
}
return newName;
}
function Profile() {
const [currentName, setCurrentName] = useState("John Doe");
const [state, updateName] = useActionState(async (prevState, newName) => {
try {
const updatedName = await updateProfileName(newName);
setCurrentName(updatedName); // ๋๊ด์ ์
๋ฐ์ดํธ
return updatedName; // ์ฑ๊ณต์ ๋ํ๋ด๋ ๊ฐ ๋ฐํ
} catch (error) {
// ์คํจ ์ ๋๊ด์ ์
๋ฐ์ดํธ ๋๋๋ฆฌ๊ธฐ (์ค์!)
setCurrentName(prevState);
throw error; // ์ํ ์
๋ฐ์ดํธ๋ฅผ ์ํด ๋ค์ throw
}
});
return (
Current Name: {currentName}
);
}
export default Profile;
์ด ์์ ์์:
updateProfileNameํจ์๋ ์๋ฒ์์ ์ฌ์ฉ์ ํ๋กํ ์ด๋ฆ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค.currentName์ํ ๋ณ์๋ ์ฌ์ฉ์์ ํ์ฌ ์ด๋ฆ์ ์ ์ฅํฉ๋๋ค.useActionStateํ ์ ์ด๋ฆ ์ ๋ฐ์ดํธ ์ก์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.- ์๋ฒ ์์ฒญ์ ํ๊ธฐ ์ ์ UI๋ ์ ์ด๋ฆ์ผ๋ก ๋๊ด์ ์ผ๋ก ์
๋ฐ์ดํธ๋ฉ๋๋ค(
setCurrentName(newName)). - ์๋ฒ ์์ฒญ์ด ์คํจํ๋ฉด UI๋ ์ด์ ์ด๋ฆ์ผ๋ก ๋๋๋ ค์ง๋๋ค(
setCurrentName(prevState)). - ์ค๋ฅ ๋ฐ ์ฑ๊ณต ๋ฉ์์ง๋
state์ ๋ฐ๋ผ ํ์๋ฉ๋๋ค.
์ค๋ช : ์ด ์์ ๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ฌ์ค๋๋ค. UI๊ฐ ์ฆ์ ์ ๋ฐ์ดํธ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ฐ์์ ์ผ๋ก ๋๊ปด์ง๋๋ค. ์ ๋ฐ์ดํธ๊ฐ ์คํจํ๋ฉด(์ ์ด๋ฆ์ผ๋ก "error"๋ฅผ ์ ๋ ฅํ์ฌ ์๋ฎฌ๋ ์ด์ ) UI๊ฐ ๋๋๋ ค์ ธ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ํต์ฌ์ ์ด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ก์ ์ด ์คํจํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ ๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฌ๊ฑฐ๋ ๋ถ์์ ํ ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ์ํด, ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ๊ทน์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์ 3: ํ์ผ ์ ๋ก๋
ํ์ผ ์
๋ก๋๋ ํํ ๋น๋๊ธฐ ์์
์
๋๋ค. experimental_useActionState๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ ์
๋ก๋ ์ค ๋ก๋ฉ ์ํ, ์งํ๋ฅ ์
๋ฐ์ดํธ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ตญ๊ฐ์ ์ฌ์ฉ์๋ค์ด ์ค์ ์๋ฒ์ ํ์ผ์ ์
๋ก๋ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด
์๋ค. ํ์ผ ํฌ๊ธฐ์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์์๊ฒ ๋ช
ํํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
import React from 'react';
import { experimental_useActionState as useActionState } from 'react';
async function uploadFile(file) {
// ์งํ๋ฅ ์
๋ฐ์ดํธ๋ฅผ ํฌํจํ ํ์ผ ์
๋ก๋ ์๋ฎฌ๋ ์ด์
return new Promise((resolve, reject) => {
let progress = 0;
const interval = setInterval(() => {
progress += 10;
// ์ ์ฌ์ ์ธ ์๋ฒ ์ค๋ฅ ์๋ฎฌ๋ ์ด์
if(progress >= 50 && file.name === "error.txt") {
clearInterval(interval);
reject(new Error("File upload failed!"));
return;
}
if (progress >= 100) {
clearInterval(interval);
resolve("File uploaded successfully!");
}
// ์ค์ ์๋๋ฆฌ์ค์์๋ ์ฌ๊ธฐ์ ์งํ๋ฅ ์
๋ฐ์ดํธ๋ฅผ ๋์คํจ์นํฉ๋๋ค
}, 100);
});
}
function FileUploader() {
const [state, upload] = useActionState(async (prevState, file) => {
return uploadFile(file);
});
const handleFileChange = (event) => {
const file = event.target.files[0];
upload(file);
};
return (
{state === null ? null : Uploading...
}
{state instanceof Error && Error: {state.message}
}
{typeof state === 'string' && {state}
}
);
}
export default FileUploader;
์ด ์์ ์์:
uploadFileํจ์๋ ์งํ๋ฅ ์ ๋ฐ์ดํธ์ ํจ๊ป ํ์ผ ์ ๋ก๋๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค(์ค์ ๊ตฌํ์์๋ ์ง์ ํ ์งํ๋ฅ ์ ๋ฐ์ดํธ ๋ฉ์ปค๋์ฆ์ด ํ์ํจ).useActionStateํ ์ ํ์ผ ์ ๋ก๋ ์ก์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.- ํ์ผ์ด ์ ๋ก๋๋๋ ๋์ UI์ "Uploading..." ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
- ์ค๋ฅ ๋ฐ ์ฑ๊ณต ๋ฉ์์ง๋
state์ ๋ฐ๋ผ ํ์๋ฉ๋๋ค.
์ค๋ช
:
์ด ๊ฐ์ํ๋ ์์ ์๋ ์ค์ ์งํ๋ฅ ์
๋ฐ์ดํธ๊ฐ ํฌํจ๋์ด ์์ง ์์ง๋ง, experimental_useActionState๊ฐ ์
๋ก๋์ ์ ๋ฐ์ ์ธ ์ํ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ uploadFile ํจ์ ๋ด์ ์งํ๋ฅ ๋ณด๊ณ ๋ฉ์ปค๋์ฆ์ ํตํฉํ๊ณ ์ ์ฌ์ ์ผ๋ก ์งํ๋ฅ ์ ๋ณด๋ก ์ํ๋ฅผ ์
๋ฐ์ดํธํ ๊ฒ์
๋๋ค. ์ข์ ๊ตฌํ์ ์
๋ก๋ ์์
์ ์ทจ์ํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๋์ญํญ์ด ์ ํ๋ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, ์
๋ก๋ ์งํ ์ํฉ๊ณผ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค.
experimental_useActionState ์ฌ์ฉ์ ์ด์
- ๊ฐ์ํ๋ ์ํ ๊ด๋ฆฌ: ์ก์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์ค์ ๋๋ค.
- ํฅ์๋ ์ฝ๋ ๊ฐ๋ ์ฑ: ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- ๊ฐ์ ๋ ์ฌ์ฉ์ ๊ฒฝํ: ๋น๋๊ธฐ ์์ ์ค ์ฌ์ฉ์์๊ฒ ๋ช ํํ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
- ์ค๋ฅ ๊ฐ์: ์๋ ์ํ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ์ค๋ฅ์ ์ํ์ ์ต์ํํฉ๋๋ค.
- ๋๊ด์ ์ ๋ฐ์ดํธ: ํฅ์๋ ์ฑ๋ฅ์ ์ํ ๋๊ด์ ์ ๋ฐ์ดํธ ๊ตฌํ์ ๋จ์ํํฉ๋๋ค.
๊ณ ๋ ค์ฌํญ ๋ฐ ์ ํ์ฌํญ
- ์คํ์ API:
experimental_useActionStateํ ์ React์ ์คํ์ API์ ์ผ๋ถ์ด๋ฉฐ ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ฃผ์ํด์ ์ฌ์ฉํ์ธ์. - ์ค๋ฅ ์ฒ๋ฆฌ: ์ก์ ํจ์๊ฐ ์์ธ๋ฅผ ๋ฐ์์์ผ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํ์ญ์์ค. ์ด๋ฅผ ํตํด React๊ฐ ์๋์ผ๋ก ์ํ๋ฅผ ์ค๋ฅ ๋ฉ์์ง๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- ์ํ ์
๋ฐ์ดํธ:
experimental_useActionStateํ ์ ์ก์ ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ก์ ํจ์ ๋ด์์ ์๋์ผ๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธํ์ง ๋ง์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋ก
- ์ก์ ์ ์์ํ๊ฒ ์ ์ง: ์ก์ ํจ์๊ฐ ์์ ํจ์์ธ์ง ํ์ธํ์ธ์. ์ฆ, ๋ถ์์ฉ์ด ์๊ณ (UI ์ ๋ฐ์ดํธ ์ ์ธ) ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํด์ผ ํฉ๋๋ค.
- ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ: ์ก์ ํจ์์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ธ์.
- ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉ: ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ง๋ง, ์ฑ๊ณต ๊ฐ๋ฅ์ฑ์ด ๋์ ์ํฉ์์ ์ ์คํ๊ฒ ์ฌ์ฉํ์ธ์.
- ๋ช ํํ ํผ๋๋ฐฑ ์ ๊ณต: ๋ก๋ฉ ์ํ, ์งํ๋ฅ ์ ๋ฐ์ดํธ, ์ค๋ฅ ๋ฉ์์ง์ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ค ์ฌ์ฉ์์๊ฒ ๋ช ํํ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ธ์.
- ์ฒ ์ ํ ํ ์คํธ: ์ฑ๊ณต, ์คํจ ๋ฐ ์ฃ์ง ์ผ์ด์ค๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ๋ฅํ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ธ์.
๊ตฌํ์ ์ํ ๊ธ๋ก๋ฒ ๊ณ ๋ ค์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ experimental_useActionState๋ฅผ ๊ตฌํํ ๋ ๋ค์์ ๊ณ ๋ คํ์ธ์:
- ํ์งํ: ๋ชจ๋ ์ค๋ฅ ๋ฉ์์ง์ ์ฑ๊ณต ๋ฉ์์ง๊ฐ ๋ค๋ฅธ ์ธ์ด์ ์ง์ญ์ ๋ง๊ฒ ์ ์ ํ ํ์งํ๋์๋์ง ํ์ธํ์ธ์. ๋ฒ์ญ ๊ด๋ฆฌ๋ฅผ ์ํด ๊ตญ์ ํ(i18n) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ์๊ฐ๋: ๋ค๋ฅธ ์์น์ ์ฌ์ฉ์์๊ฒ ๋ ์ง์ ์๊ฐ์ ํ์ํ ๋ ์๊ฐ๋๋ฅผ ์ผ๋์ ๋์ธ์. ์๊ฐ๋ ๋ณํ์ ์ฒ๋ฆฌํ๋ ์ ์ ํ ๋ ์ง ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ํตํ ํ์: ์ฌ์ฉ์์ ๋ก์บ์ ๋ฐ๋ผ ํตํ ๊ฐ์ ํ์ํํ์ธ์. ๋ค๋ฅธ ํตํ ๊ธฐํธ์ ์์์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํตํ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ: ๋ค๋ฅธ ์ง์ญ์ ์ฌ์ฉ์์ ์ํธ ์์ฉํ ๋ ์ ์ฌ์ ์ธ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ๋ฌธ์ ๋ฅผ ์ธ์งํ์ธ์. ์ฑ๋ฅ ํฅ์์ ์ํด ๋๊ด์ ์ ๋ฐ์ดํธ ๋ฐ ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ธ์.
- ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ: ์ ๋ฝ์ GDPR ๋ฐ ์บ๋ฆฌํฌ๋์์ CCPA์ ๊ฐ์ ๋ค๋ฅธ ๊ตญ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ค์ํ์ธ์. ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ฌ์ฉ์๋ก๋ถํฐ ๋์๋ฅผ ์ป์ผ์ธ์.
- ์ ๊ทผ์ฑ: ์์น์ ๊ด๊ณ์์ด ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ธ์. WCAG์ ๊ฐ์ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ํฌ์ฉ์ ์ผ๋ก ๋ง๋์ธ์.
- ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก(RTL) ์ง์: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฐ๋ ์ธ์ด(์: ์๋์ด, ํ๋ธ๋ฆฌ์ด)๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ, ๋ ์ด์์๊ณผ ์คํ์ผ์ด RTL ํ๊ฒฝ์ ๋ง๊ฒ ์ ์ ํ ์กฐ์ ๋์๋์ง ํ์ธํ์ธ์.
- ๊ธ๋ก๋ฒ CDN (์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ): ๊ธ๋ก๋ฒ CDN์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ ๊ฐ๊น์ด ์๋ฒ์์ ์ ์ ์์ฐ(์ด๋ฏธ์ง, CSS, JavaScript)์ ์ ๊ณตํ์ธ์. ์ด๋ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
experimental_useActionState ํ
์ React ์ ํ๋ฆฌ์ผ์ด์
์์ ์ก์
์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์ฝ๋ ๊ฐ๋
์ฑ์ ํฅ์์ํค๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ด ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์คํ์ ์ธ ํน์ฑ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํ์ง๋ง, experimental_useActionState์ ์ ์ฌ์ ์ด์ ์ ๋ชจ๋ React ๊ฐ๋ฐ์์๊ฒ ๊ท์คํ ๋๊ตฌ๊ฐ ๋ ๊ฒ์
๋๋ค. ํ์งํ, ์๊ฐ๋, ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ๊ณผ ๊ฐ์ ๊ธ๋ก๋ฒ ์์๋ฅผ ๊ณ ๋ คํจ์ผ๋ก์จ experimental_useActionState๋ฅผ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ง์ ํ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ด๋ฌํ ํ์ ์ ์ธ ๊ธฐ๋ฅ์ ํ์ํ๊ณ ์ฑํํ๋ ๊ฒ์ ํ๋์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ผ ๊ฒ์
๋๋ค. ์ด ๊ธฐ์ ๋ฟ๋ง ์๋๋ผ ์ด๋ค ๊ธฐ์ ์ด๋ ๊ตฌํํ ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๋ค์ํ ๋ฐฐ๊ฒฝ๊ณผ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ณ ๋ คํ์ธ์.